package com.kob.botrunningsystem.service.impl.utils;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class BotPool extends Thread {
    private final ReentrantLock lock = new ReentrantLock(); // 引入锁的对象
    private final Condition condition = lock.newCondition();
    private Queue<Bot> bots = new LinkedList<>(); // 消息队列

    public void addBot(Integer userId, String botCode, String inpurt) {
        lock.lock();
        try {
            bots.add(new Bot(userId, botCode, inpurt));
            condition.signalAll(); // 唤醒所有线程
        } finally {
            lock.unlock(); // 解锁
        }
    }

    private void consume(Bot bot) {   // 消费者
        Consumer consumer = new Consumer();
        consumer.startTimeout(2000, bot); // 最多等待两秒钟
    }

    @Override
    public void run() {
        while (true) {
            lock.lock();
            if (bots.isEmpty()) {
                try {
                    condition.await(); // 线程睡眠；
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    lock.unlock();
                    break;
                }
            } else {
                Bot bot = bots.remove(); // 删除对头
                lock.unlock(); // 解锁过程 只有读写冲突的时候才会阻塞
                consume(bot); //  比较耗时， 可能会执行几秒钟（因为其他函数执行只需要几毫秒） 编译比较浪费时间
            }
        }
    }
}
